from flask_login import LoginManager
from flask import Flask, send_from_directory
from aide.UserAide import User

WebApp = Flask(__name__, static_folder='./html/admin', static_url_path='', template_folder="templates")
WebApp.config['SECRET_KEY'] = 'aBcd1234.'
login_manager = LoginManager()
login_manager.init_app(WebApp)


@login_manager.user_loader
def load_user(user_id):
    # print('登录成功后，每次访问都会调用该方法', user_id)
    cur_user = User(user_id)
    cur_user.set_attribute()
    return cur_user


@WebApp.errorhandler(404)
def page_not_found(error):
    return 'This page does not exist', 404


@WebApp.route('/html/<path:filename>')
def html(filename):
    # 注册一个静态资源目录
    return send_from_directory('./html/', filename)


class DbCreator:
    def __init__(self):
        from tools.SQLiteHelper import SQLiteHelper
        # 初始化数据库
        self.db = SQLiteHelper('./.crontab-management-system.db', auto_commit=False, synchronous='OFF')
        self.c1()
        self.c2()
        self.c3()
        self.c4()
        self.c5()

    # 1、服务器资源表
    def c1(self):
        table_name = 'esc_resource'
        _ddl = [
            {'field': 'id', 'type': 'INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT'},  # 主键ID
            {'field': 'name', 'type': 'text(40)'},  # 执行资源名称
            {'field': 'connect_type', 'type': 'integer(3)'},  # 连接类型 1:ssh
            {'field': 'ip_address', 'type': 'text(15)'},  # IP地址
            {'field': 'port', 'type': 'integer(10)'},  # 端口
            {'field': 'remark', 'type': 'text(500)'},  # 资源说明
            {'field': 'login_type', 'type': 'integer(3)'},  # 验证登录类型 1:密码 2:密钥
            {'field': 'account', 'type': 'text(40)'},  # 登录账号
            {'field': 'password', 'type': 'text(40)'},  # 登录密码
            {'field': 'public_key_path', 'type': 'text(255)'},  # 公钥地址
            {'field': 'private_key_path', 'type': 'text(255)'},  # 私钥地址
            {'field': 'created_at', 'type': 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP'},
        ]
        self.db.create_table(table_name, _ddl)
        self.db.commit()

    # 2、任务分组
    def c2(self):
        table_name = 'tasks_group'
        _ddl = [
            {'field': 'id', 'type': 'INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT'},  # 主键ID
            {'field': 'name', 'type': 'text(40)'},  # 分组名称
            {'field': 'created_at', 'type': 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP'},
        ]
        self.db.create_table(table_name, _ddl)
        self.db.commit()

    # 3、任务列表
    def c3(self):
        table_name = 'tasks'
        _ddl = [
            {'field': 'id', 'type': 'INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT'},  # 主键ID
            {'field': 'name', 'type': 'text(40)'},  # 任务名称
            {'field': 'group_id', 'type': 'integer(10)'},  # 任务名称
            {'field': 'ecs_id', 'type': 'integer(10)'},  # 执行服务器
            {'field': 'remark', 'type': 'text(500)'},  # 任务说明
            {'field': 'crontab_expression', 'type': 'text(40)'},  # 时间表达示
            {'field': 'crontab_shell', 'type': 'text(500)'},  # 任务脚本
            {'field': 'timeout', 'type': 'integer(10) DEFAULT 0'},  # 超时
            {'field': 'error_inform', 'type': 'integer(3) DEFAULT 2'},  # 出错通知 1是 2否
            {'field': 'status', 'type': 'integer(3) DEFAULT 2'},  # 状态 1运行中 2停止
            {'field': 'created_at', 'type': 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP'},
        ]
        self.db.create_table(table_name, _ddl)
        self.db.commit()

    # 4、任务执行日志
    def c4(self):
        table_name = 'tasks_log'
        _ddl = [
            {'field': 'id', 'type': 'INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT'},  # 主键ID
            {'field': 'tid', 'type': 'text(40)'},  # 任务id
            {'field': 'result', 'type': 'text(9999)'},  # 执行结果
            {'field': 'status', 'type': 'integer(3)'},  # 1成功 2失败
            {'field': 'created_at', 'type': 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP'},
        ]
        self.db.create_table(table_name, _ddl)
        self.db.commit()

    # 5、用户表
    def c5(self):
        table_name = 'users'
        _ddl = [
            {'field': 'id', 'type': 'INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT'},  # 主键ID
            {'field': 'name', 'type': 'text(40)'},
            {'field': 'account', 'type': 'text(40)'},
            {'field': 'passwd', 'type': 'text(128)'},
        ]
        self.db.create_table(table_name, _ddl)
        self.db.commit()
        if self.db.count('users') <= 0:
            self.db.insert('users', {'name': 'admin', 'account': 'root', 'passwd': 'root!=1234e'})


DbCreator()
